#include "navigation_bar.h"

#include "lvgl.h"
#include "config/CustomConfig.h"

/**
 * 创建通用 Navigation Bar
 * @param parent 父对象
 * @param title 标题文本
 * @param back_title 返回按钮标题
 * @param bg_color 背景颜色
 * @param title_color 标题字体颜色，例如lv_color_white()
 * @param back_cb 返回按钮点击事件
 * @param title_font 标题字体，例如LV_FONT_DEFAULT
 */
lv_obj_t *back_nav_bar_create(lv_obj_t *parent,
                        const char *title,
                        const char *back_title,
                        lv_color_t bg_color,
                        lv_color_t title_color,
                        lv_event_cb_t back_cb,
                        const lv_font_t *title_font) {
    // 设置默认标题
    if (title == NULL) {
        title = "";
    }
    // 设置默认返回按钮标题
    if (back_title == NULL) {
        back_title = "< Back";
    }
    // 设置默认标题
    if (title_font == NULL) {
        title_font = LV_FONT_DEFAULT;
    }

    // 创建一个容器作为导航栏
    lv_obj_t *nav = lv_obj_create(parent);
    lv_obj_set_size(nav, lv_pct(100), NAV_BAR_H);
    lv_obj_set_style_bg_color(nav, bg_color, 0);
    lv_obj_set_style_pad_all(nav, 0, 0);
    lv_obj_clear_flag(nav, LV_OBJ_FLAG_SCROLLABLE);

    // 返回按钮
    lv_obj_t *back_btn = lv_button_create(nav);
    lv_obj_align(back_btn, LV_ALIGN_TOP_LEFT, NAV_BAR_LEFT_PADDING, NAV_BAR_TOP_PADDING);
    lv_obj_set_size(back_btn, 60, NAV_BAR_BTN_H);
    lv_obj_add_event_cb(back_btn, back_cb, LV_EVENT_CLICKED, NULL);

    lv_obj_t *btn_label = lv_label_create(back_btn);
    lv_label_set_text(btn_label, "< Back");
    lv_obj_center(btn_label);// 设置元素位置为父视图正中间，整体居中对齐

    // 标题
    lv_obj_t *label = lv_label_create(nav);
    lv_label_set_text(label, title);
    lv_obj_set_style_text_color(label, title_color, 0);
    lv_obj_set_style_text_font(label, title_font, 0);
    lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);

    return nav;
}

/**
 * 创建通用 Navigation Bar
 * @param parent 父对象
 * @param title 标题文本
 * @param back_img_src 返回按钮图片资源（LV_IMG_DECLARE 生成的）
 * @param bg_color 背景颜色
 * @param title_color 标题字体颜色，例如lv_color_white()
 * @param back_cb 返回按钮点击事件
 * @param title_font 标题字体，例如LV_FONT_DEFAULT
 */
lv_obj_t *nav_bar_create(lv_obj_t *parent,
                        const char *title,
                        const void *back_img_src,
                        lv_color_t bg_color,
                        lv_color_t title_color,
                        lv_event_cb_t back_cb,
                        const lv_font_t *title_font) {
    // 设置默认标题
    if (title == NULL) {
        title = "";
    }
    // 设置默认返回按钮图标
    if (back_img_src == NULL) {
        //Q: ✅ 通过在线网站LVGL Image Converter (https://lvgl.io/tools/imageconverter)，
        // 将BMP / JPG / PNG / SVG转为LVGL可识别格式即C数组C array
        // 例如图片名称back.png转为LVGL可识别格式后得到back.c，然后在CMakeList.txt配置文件通过CMake指令的add_executable
        // CMakeList.txt配置文件发生改动变更或者新增了c文件，MacOS系统需执行cmake ..指令，Windows系统需打开"MSYS2 MINGW64"软件，
        // 进入build文件夹路径：cd /f/c/EmbeddedDevelopment/demos/lv_port_pc_vscode/build，执行编译指令：cmake .. -G "MinGW Makefiles"
        // 添加该back.c进入编译范围内，在调用图片的地方声明 back.png 对应的图片对象LV_IMG_DECLARE(back);再传给参数const void *src；
        LV_IMG_DECLARE(back);
        back_img_src = &back;
    }
    // 设置默认标题
    if (title_font == NULL) {
        title_font = LV_FONT_DEFAULT;
    }

    // 创建一个容器作为导航栏
    lv_obj_t *nav = lv_obj_create(parent);
    lv_obj_set_size(nav, lv_pct(100), NAV_BAR_H);
    lv_obj_set_style_bg_color(nav, bg_color, 0);
    lv_obj_set_style_pad_all(nav, 0, 0);
    lv_obj_clear_flag(nav, LV_OBJ_FLAG_SCROLLABLE);

    // 返回按钮
    lv_obj_t *back_btn = lv_imgbtn_create(nav);
    if (back_img_src != NULL) {
        lv_imgbtn_set_src(back_btn, LV_IMGBTN_STATE_RELEASED, NULL, back_img_src, NULL);
    }
    lv_obj_align(back_btn, LV_ALIGN_LEFT_MID, NAV_BAR_LEFT_PADDING, NAV_BAR_TOP_PADDING);
    lv_obj_set_size(back_btn, NAV_BAR_BTN_H, NAV_BAR_BTN_H);
    lv_obj_add_event_cb(back_btn, back_cb, LV_EVENT_CLICKED, NULL);

    // 标题
    lv_obj_t *label = lv_label_create(nav);
    lv_label_set_text(label, title);
    lv_obj_set_style_text_color(label, title_color, 0);
    lv_obj_set_style_text_font(label, title_font, 0);
    lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);

    return nav;
}

/**
 * 创建普通 Navigation Bar
 * @param parent 父对象
 * @param title 标题文本
 * @param back_cb 返回按钮点击事件
 * @return 导航栏对象 (lv_obj_t *)
 */
lv_obj_t *normal_nav_bar_create(lv_obj_t *parent,
                                const char *title,
                                lv_event_cb_t back_cb) {
    return back_nav_bar_create(parent, title, NULL, lv_color_white(), lv_color_black(), back_cb, NULL);
}

// 编译报错❌：
// /Users/raterebriduo/Desktop/lv_port_pc_vscode/utils/components/navigation_bar.c:147:11: error: conflicting types for 'img_bar_create'
//   147 | lv_obj_t *img_bar_create(lv_obj_t *parent,
//       |           ^
// /Users/raterebriduo/Desktop/lv_port_pc_vscode/utils/components/navigation_bar.h:65:11: note: previous declaration is here
//    65 | lv_obj_t *img_bar_create(lv_obj_t *parent,
//       |           ^
// 1 error generated.
// 原因分析✅：
// navigation_bar.h已声明了一个函数img_bar_create，后面.c也声明了另一个函数img_bar_create，导致函数名重复冲突
// 两个函数参数不一样导致编译器判定为不同函数
// 解决办法✅：
// 方案1️⃣：如果确实是不同的函数，则把函数名称改成不同的规避函数名称重复的冲突；
// 方案2️⃣：如果确认是相同的函数则确保函数名、参数名称&类型 及 返回值类型保持一致，
// 编译器判定为.h和.c是同一个函数就不会认为是不同函数的名称重复冲突；


/**
 * 创建图片 Navigation Bar
 * @param parent 父对象
 * @param title 标题文本
 * @param back_img_src 左侧按钮图标
 * @param back_cb 返回按钮点击事件
 * @return 导航栏对象 (lv_obj_t *)
 */
lv_obj_t *img_bar_create(lv_obj_t *parent,
                        const char *title,
                        const void *back_img_src,
                        lv_event_cb_t back_cb) {
    return nav_bar_create(parent, title, back_img_src, lv_color_white(), lv_color_black(), back_cb, NULL);
}
